package com.tcsl.mylibrary.utils;

import android.app.Activity;
import android.content.Intent;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import java.util.List;

/**
 * 描述:飞凡支付辅助类
 * <p/>作者：wjx
 * <p/>创建时间: 2017/5/27 15:12
 */
public class PosHelper {
    // ============== ALL ACTION ================
    private static final String POS_ACTION_PAY = "com.wanda.pos.business.ACTION_PAY";
    private static final String POS_ACTION_REFUND = "com.wanda.pos.business.ACTION_REFUND";
    private static final String POS_ACTION_TRADE_QUERY = "com.wanda.pos.business" + "" +
            ".ACTION_TRADE_QUERY";
    private static final String POS_ACTION_EXCHANGE = "com.wanda.pos.business" + "" +
            ".ACTION_EXCHANGE";
    private static final String POS_ACTION_REGISTER = "com.wanda.pos.business.ACTION_REGISTER";
    private static final String POS_ACTION_SETTING = "com.wanda.pos.business.ACTION_SETTING";
    private static final String EXTRA_ACCOUNT = "extra_account";
    private static final String EXTRA_PRODUCTS = "extra_products";

    /**
     * 调用POS支付的方法，通过{@link Activity#startActivityForResult(Intent, int)}方式唤起POS支付业务
     *
     * @param activity
     * @param orderNo     合作方订单号，需要保证唯一性
     * @param account     合作方登录账号
     * @param amount      支付的金额，以分为单位，如100.01元，则应传入10001
     * @param payType     支付方式，参见{@link FFResult 中的支付类型 ,如传入非支付类型值则视为未选择支付方式}
     * @param products    商品信息，以列表形式，商品类型具体见{@link Product}
     * @param requestCode 对应{@link Activity#startActivityForResult(Intent, int)}中的requestCode参数
     * @return 如果为true 则启动POS支付成功，如果为false，则启动POS支付失败
     */
    public static boolean pay(Activity activity, String orderNo, String account, long amount, int
            payType, List<Product> products, int requestCode) {
        try {
            Intent intent = new Intent(POS_ACTION_PAY);
            intent.putExtra(FFResult.EXTRA_ORDER_NO, orderNo);
            intent.putExtra(EXTRA_ACCOUNT, account);
            intent.putExtra(FFResult.EXTRA_AMOUNT, amount);
            try {
                JSONArray array = new JSONArray();
                for (Product p : products) {
                    array.put(p.toJSONObject());
                }
                intent.putExtra(EXTRA_PRODUCTS, array.toString());
            } catch (JSONException e) {
                e.printStackTrace();
            }
            activity.startActivityForResult(intent, requestCode);
            return true;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return false;
    }

    /**
     * 在{@link Activity#onActivityResult(int requestCode, int resultCode, Intent data)}
     * 方法中，將data作为入参传递进来，得到{@link FFResult.PayResult}用于解析POS支付返回结果
     *
     * @param data 对应onActivityResult中的data参数
     * @return {@link FFResult.PayResult}
     */
    public static FFResult.PayResult getPayResult(Intent data) {
        try {
            return new FFResult.PayResult(data);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 调用POS退款的方法，通过{@link Activity#startActivityForResult(Intent, int)}方式唤起POS退款业务
     *
     * @param activity
     * @param orderNo     POS支付单号
     * @param account     合作方登录账号
     * @param products    商品信息，以列表形式，商品类型具体见{@link Product}
     * @param requestCode 对应{@link Activity#startActivityForResult(Intent, int)}中的requestCode参数
     * @return 如果为true 则启动POS退款成功，如果为false，则启动POS退款失败
     */
    public static boolean refund(Activity activity, String orderNo, String account, List<Product>
            products, int requestCode) {
        try {
            Intent intent = new Intent(POS_ACTION_REFUND);
            intent.putExtra(FFResult.EXTRA_PAY_ORDER_NO, orderNo);
            intent.putExtra(EXTRA_ACCOUNT, account);
            try {
                JSONArray array = new JSONArray();
                for (Product p : products) {
                    array.put(p.toJSONObject());
                }
                intent.putExtra(EXTRA_PRODUCTS, array.toString());
            } catch (JSONException e) {
                e.printStackTrace();
            }
            activity.startActivityForResult(intent, requestCode);
            return true;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return false;
    }

    /**
     * 在{@link Activity#onActivityResult(int requestCode, int resultCode, Intent data)}
     * 方法中，將data作为入参传递进来，得到{@link FFResult.RefundResult}用于解析POS退款返回结果
     *
     * @param data 对应onActivityResult中的data参数
     * @return {@link FFResult.RefundResult}
     */
    public static FFResult.RefundResult getRefundResult(Intent data) {
        try {
            return new FFResult.RefundResult(data);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 调用POS订单详情的方法，通过{@link Activity#startActivityForResult(Intent, int)}方式唤起POS订单详情查询业务
     *
     * @param activity
     * @param orderNo     合作方订单号，需要保证唯一性
     * @param account     合作方登录账号
     * @param payOrderNo  POS支付单号
     * @param products    商品信息，以列表形式，商品类型具体见{@link Product}
     * @param requestCode 对应{@link Activity#startActivityForResult(Intent, int)}中的requestCode参数
     * @return 如果为true 则启动POS订单详情界面成功，如果为false，则启动POS订单详情界面失败
     */
    public static boolean queryTrade(Activity activity, String orderNo, String account, String
            payOrderNo, List<Product> products, int requestCode) {
        try {
            Intent intent = new Intent(POS_ACTION_TRADE_QUERY);
            intent.putExtra(FFResult.EXTRA_ORDER_NO, orderNo);
            intent.putExtra(FFResult.EXTRA_PAY_ORDER_NO, payOrderNo);
            intent.putExtra(EXTRA_ACCOUNT, account);

            try {
                JSONArray array = new JSONArray();
                for (Product p : products) {
                    array.put(p.toJSONObject());
                }
                intent.putExtra(EXTRA_PRODUCTS, array.toString());
            } catch (JSONException e) {
                e.printStackTrace();
            }
            activity.startActivityForResult(intent, requestCode);
            return true;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return false;
    }

    /**
     * 在{@link Activity#onActivityResult(int requestCode, int resultCode, Intent data)}
     * 方法中，將data作为入参传递进来，得到{@link FFResult.TradeQueryResult}用于解析POS订单查询返回结果
     *
     * @param data 对应onActivityResult中的data参数
     * @return {@link FFResult.TradeQueryResult}
     */
    public static FFResult.TradeQueryResult getTradeQueryResult(Intent data) {
        try {
            return new FFResult.TradeQueryResult(data);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 调用POS核销的方法，通过{@link Activity#startActivityForResult(Intent, int)}方式唤起POS核销业务
     *
     * @param activity
     * @param code        核销码(可以不传递)
     * @param requestCode 对应{@link Activity#startActivityForResult(Intent, int)}中的requestCode参数
     * @return 如果为true 则启动POS核销界面成功，如果为false，则启动POS核销界面失败
     */
    public static boolean exchange(Activity activity, String code, int requestCode) {
        try {
            Intent intent = new Intent(POS_ACTION_EXCHANGE);
            intent.putExtra(FFResult.EXTRA_CODE, code);
            activity.startActivityForResult(intent, requestCode);
            return true;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return false;
    }

    /**
     * 在{@link Activity#onActivityResult(int requestCode, int resultCode, Intent data)}
     * 方法中，將data作为入参传递进来，得到{@link FFResult.ExchangeResult}用于解析POS核销返回结果
     *
     * @param data 对应onActivityResult中的data参数
     * @return {@link FFResult.ExchangeResult}
     */
    public static FFResult.ExchangeResult getExchangeResult(Intent data) {
        try {
            return new FFResult.ExchangeResult(data);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 调用POS注册会员的方法，通过{@link Activity#startActivityForResult(Intent, int)}方式唤起POS注册会员业务
     *
     * @param activity
     * @param phone       注册会员手机号
     * @param requestCode 对应{@link Activity#startActivityForResult(Intent, int)}中的requestCode参数
     * @return 如果为true 则启动POS核销界面成功，如果为false，则启动POS核销界面失败
     */
    public static boolean register(Activity activity, String phone, int requestCode) {
        try {
            Intent intent = new Intent(POS_ACTION_REGISTER);
            intent.putExtra(FFResult.EXTRA_PHONE, phone);
            activity.startActivityForResult(intent, requestCode);
            return true;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return false;
    }

    /**
     * 在{@link Activity#onActivityResult(int requestCode, int resultCode, Intent data)}
     * 方法中，將data作为入参传递进来，得到{@link FFResult.RegisterResult}用于解析POS注册会员返回结果
     *
     * @param data 对应onActivityResult中的data参数
     * @return {@link FFResult.RegisterResult}
     */
    public static FFResult.RegisterResult getRegisterResult(Intent data) {
        try {
            return new FFResult.RegisterResult(data);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 调用POS的设置界面
     *
     * @param activity
     * @return 如果为true 则启动POS设置界面成功，如果为false，则启动POS设置界面失败
     */
    public static boolean setting(Activity activity) {
        return setting(activity, -1);
    }

    /**
     * 调用POS的设置界面，通过{@link Activity#startActivityForResult(Intent, int)}方式唤起POS设置界面
     *
     * @param activity
     * @param requestCode 对应{@link Activity#startActivityForResult(Intent, int)}中的requestCode参数
     * @return 如果为true 则启动POS设置界面成功，如果为false，则启动POS设置界面失败
     */
    public static boolean setting(Activity activity, int requestCode) {
        try {
            Intent intent = new Intent(POS_ACTION_SETTING);
            activity.startActivityForResult(intent, requestCode);
            return true;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return false;
    }

    public static class Product {
        public final String mProductId;
        public final int mCount;
        public final long mPrice;
        public final String mName;

        /**
         * @param productId 商品ID，唯一
         * @param count     购买数量
         * @param price     商品单价
         * @param name      商品名称
         */
        public Product(String productId, String name, int count, long price) {
            mProductId = productId;
            mName = name;
            mCount = count;
            mPrice = price;
        }

        public JSONObject toJSONObject() throws JSONException {
            JSONObject jsonObject = new JSONObject();
            jsonObject.put("productId", mProductId);
            jsonObject.put("count", mCount);
            jsonObject.put("price", mPrice);
            jsonObject.put("title", mName); // force
            return jsonObject;
        }
    }
}
